package reversi.gui;

import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import reversi.cliente.controlConexion;
import reversi.xml.XmlParser;

public class PanelDeJuego extends JPanel {
	
	private static final ImageIcon FICHA_NEGRA = new ImageIcon("imagenes/fichanegra_64.gif");
	private static final ImageIcon FICHA_VERDE = new ImageIcon("imagenes/fichaverde_64.gif");
	//Indica el turno de quien juega, las negras siempre juegan primero
	private static ImageIcon turno=FICHA_NEGRA;
	
	//Indica quien es el rival
	private static String rival=null;
	
	XmlParser xml = new XmlParser();
	
	private String jugada;
	
	private static Boolean miTurno=false;
	/**
	 * 
	 */
	private static final long serialVersionUID = 7112526622177442011L;

	private static int NUMERO_DE_FILAS = 8;
	private static int NUMERO_DE_COLUMNAS = 8;
	private static ArrayList<ArrayList<BotonReversi>> matrizDeBotones;
	public PanelDeJuego(){
		
		
		
		matrizDeBotones = new ArrayList<ArrayList<BotonReversi>>();
		JPanel panelColumnaDePaneles = new JPanel();
		
		panelColumnaDePaneles.setLayout( new BoxLayout(panelColumnaDePaneles, BoxLayout.Y_AXIS));
		
		for (int i = 0; i < NUMERO_DE_COLUMNAS; i++) {
			ArrayList<BotonReversi> nuevaFilaDeBotones = new ArrayList<BotonReversi>();
			
			JPanel panelFilaDeFichas = new JPanel();
			panelFilaDeFichas.setLayout(new BoxLayout(panelFilaDeFichas, BoxLayout.X_AXIS));
			for (int j = 0; j < NUMERO_DE_FILAS; j++) {
				BotonReversi nuevoBoton = new BotonReversi();
				nuevoBoton.setPreferredSize(new Dimension(64,64));
				nuevaFilaDeBotones.add(nuevoBoton);
				panelFilaDeFichas.add(nuevoBoton);
				
				//Para menejar los clicks en el tablero
				nuevoBoton.addMouseListener(new presionarCasillas());
			}
			matrizDeBotones.add(nuevaFilaDeBotones);
			panelColumnaDePaneles.add(panelFilaDeFichas);

		}
		
		add(panelColumnaDePaneles);
		
		//Pone la configuracion inicial del tablero
		matrizDeBotones.get(3).get(3).setIcon(FICHA_VERDE);
		matrizDeBotones.get(3).get(4).setIcon(FICHA_NEGRA);
		matrizDeBotones.get(4).get(3).setIcon(FICHA_NEGRA);
		matrizDeBotones.get(4).get(4).setIcon(FICHA_VERDE);
		
	}
	public static void ponerRival(String r){
			rival = r;
	}
	
	public static void resetearTablero(){
		for (Integer i = 0; i < matrizDeBotones.size(); i++)
		{
			for (Integer j = 0; j < matrizDeBotones.get(i).size(); j++)
			{
				matrizDeBotones.get(i).get(j).ponerVacio();
			}
		}
		/*matrizDeBotones.get(3).get(3).ponerVerde();
		matrizDeBotones.get(3).get(4).ponerNegro();
		matrizDeBotones.get(4).get(3).ponerNegro();
		matrizDeBotones.get(4).get(4).ponerVerde();*/
		matrizDeBotones.get(3).get(3).setIcon(FICHA_VERDE);
		matrizDeBotones.get(3).get(4).setIcon(FICHA_NEGRA);
		matrizDeBotones.get(4).get(3).setIcon(FICHA_NEGRA);
		matrizDeBotones.get(4).get(4).setIcon(FICHA_VERDE);
		PanelDeInformacionSur.sumarFichas(matrizDeBotones);
		turno=FICHA_NEGRA;
	}
	public static void ponerMiTurno(String miColor){
		if(miColor == "negras"){
			miTurno=true;
			PanelDeInformacionSur.cambiarTurno(miTurno);
		}else{
			miTurno=false;
			PanelDeInformacionSur.cambiarTurno(miTurno);
		}	
	}
	public class presionarCasillas extends MouseAdapter {
		public void mouseClicked(MouseEvent e){
			Object o = e.getSource();
			for (Integer i = 0; i < matrizDeBotones.size(); i++)
			{
				for (Integer j = 0; j < matrizDeBotones.get(i).size(); j++)
				{
					//Si se selecciona un boton del tablero
					if ( o == matrizDeBotones.get(i).get(j) )
					{
						if(miTurno)
						{
							if( validarJugada(i,j) > 0 ){
								hacerJugada(i,j);
								cambiarTurno();
								//se guarda la jugada
								jugada= xml.crearXml("jugada",rival,i.toString(), j.toString());
								//se enviar la jugada
								controlConexion.enviar(jugada);
							}else{
								JOptionPane.showMessageDialog(null, "Jugada no valida");
							}
							//sumarFichas();
							PanelDeInformacionSur.sumarFichas(matrizDeBotones);
							System.out.println("Boton fila " + i + " columna "+ j + " " +
									matrizDeBotones.get(i).get(j).getIcon().toString());
							break;
						}else{
							JOptionPane.showMessageDialog(null, "No es turno de jugar");
						}
					}
				}	
			}
		}
	}

	public static void cambiarTurno(){
		if(miTurno){
			miTurno=false;
			PanelDeInformacionSur.cambiarTurno(miTurno);
		}else{
			miTurno=true;
			PanelDeInformacionSur.cambiarTurno(miTurno);
		}
		
	}
	public static ArrayList<ArrayList<BotonReversi>> obtenerMatrizDeBotones(){
		return matrizDeBotones;
	}
	//Modifica una casilla del tablero, segun sea el turno de las negras o verdes
	public static void hacerJugada(int i, int j){
		if(turno == FICHA_NEGRA){
			matrizDeBotones.get(i).get(j).setIcon(FICHA_NEGRA);
			//sumarFichas(turno);
			turno=FICHA_VERDE;
		}else{
			matrizDeBotones.get(i).get(j).setIcon(FICHA_VERDE);
			//sumarFichas(turno);
			turno=FICHA_NEGRA;
		}
	}
	
	//Metodo para validar jugadas
	public static int validarJugada(int i, int j){
		//Indica el color del rival en funcion al turno
		ImageIcon colorRival;
		int cantJugadas = 0;
		if(matrizDeBotones.get(i).get(j).esVacio() ){
			if(turno == FICHA_NEGRA)
				colorRival = FICHA_VERDE;
		    else
		    	colorRival = FICHA_NEGRA;
			
            if(puedoJugarFila(i, j, colorRival)){
            	//JOptionPane.showMessageDialog(null, "Jugada valida Fila");
            	cantJugadas++;
            }
                
            if(puedoJugarColumna(i, j, colorRival)){
            	//JOptionPane.showMessageDialog(null, "Jugada valida Columna");
            	cantJugadas++;
            }
            if(puedoJugarDiagonal(i, j, colorRival)){
            	//JOptionPane.showMessageDialog(null, "Jugada valida Diagonal");
            	cantJugadas++;
            }
        }
        return cantJugadas;
        
		
     }
	
	public static Boolean puedoJugarFila(int fila, int columna, ImageIcon colorRival)
	{
		//si la de al lado derecho es de otro color
	    if(columna < 6 && 
	    	matrizDeBotones.get(fila).get(columna+1).getIcon() == colorRival){
	    	//busco una ficha mia mas a la derecha
	    	for(int i=columna+1; i<8; i++){    	
	    		//Si esta casilla es de mi color
	    			if(matrizDeBotones.get(fila).get(i).getIcon() == turno){
	    			//desde la del rival hasta la de mi color
	    			for(int k=columna; k<i; k++){ 
	    				//cambio el color de la ficha
		                matrizDeBotones.get(fila).get(k).setIcon(turno);		                
	    			}
	    			return true;
	    		}    
	            else if( matrizDeBotones.get(fila).get(i).esVacio() )
	                break;
			}
		}	
	    //si la del lado izquierdo es de otro color
	    if(columna > 1 && 
	    	matrizDeBotones.get(fila).get(columna-1).getIcon() == colorRival)  
	    	//busco una ficha mia mas a la izquierda
	    	for(int i=columna-1; i>=0; i--)  
	    		//Si esta casilla es de mi color
	    		if(matrizDeBotones.get(fila).get(i).getIcon() == turno){
	    			//desde la del rival hasta la de mi color
	            	for(int k=columna; k>i; k--){
	            		//cambio el color de la ficha
	            		matrizDeBotones.get(fila).get(k).setIcon(turno);
	    			}
	            	return true;
	            }	            
	            else if(matrizDeBotones.get(fila).get(i).esVacio() )
	                return false;
	    return false;
	}
	
	public static Boolean puedoJugarColumna(int fila, int columna, ImageIcon colorRival)
	{
		//si la de abajo es de otro color
	    if(fila < 6 && 
	    	matrizDeBotones.get(fila+1).get(columna).getIcon()==colorRival)
	    	//busco una ficha mia mas abajo
	        for(int i=fila+1; i<8; i++)
	        	//Si esta casilla es de mi color
	            if(matrizDeBotones.get(i).get(columna).getIcon() == turno){
	            	//desde la del rival hasta la de mi color
	            	for(int k=fila; k<i; k++){ 
	            		//cambio el color de la ficha
	            		matrizDeBotones.get(k).get(columna).setIcon(turno);
	            	}
	            	return true;
	            }
	            else if(matrizDeBotones.get(i).get(columna).esVacio())
	                break;
	    //si la de arriba es de otro color
	    if(fila > 1 && 
	    		matrizDeBotones.get(fila-1).get(columna).getIcon()==colorRival)  
	    	//busco una ficha mia mas arriba
	    	for(int i=fila-1; i>=0; i--)  
	    		//Si esta casilla es de mi color
	    		if(matrizDeBotones.get(i).get(columna).getIcon() == turno){
	            	//desde la del rival hasta la de mi color
	            	for(int k=fila; k>i; k--){ 
	            		//cambio el color de la ficha
	            		matrizDeBotones.get(k).get(columna).setIcon(turno);
	            	}
	            	return true;
	            }   
	            else if(matrizDeBotones.get(i).get(columna).esVacio())
	                return false;
	    return false;
	}
	
	public static Boolean puedoJugarDiagonal(int fila, int columna, ImageIcon colorRival)
	{
	    //diagonal abajo derecha
	    if( columna < 6 && fila < 6 && 
	    	matrizDeBotones.get(fila+1).get(columna+1).getIcon()==colorRival )
	    	//busco una ficha mia mas a la derecha y abajo
	        for(int i=1; (i+columna)<8 && (i+fila)<8; i++)  
	        	//Si esta casilla es de mi color
	        	if(matrizDeBotones.get(i+fila).get(i+columna).getIcon() == turno){
	            	//desde la del rival hasta la de mi color
	            	for(int k=1; k<i; k++){ 
	            		//cambio el color de la ficha
	            		matrizDeBotones.get(fila+k).get(columna+k).setIcon(turno);
	            	}
	            	return true;
	            }	
	                
	            else if( matrizDeBotones.get(i+fila).get(i+columna).esVacio() ) 
	                break;

	    //diagonal arriba derecha
	    if(columna < 6 && fila > 1 && 
	    	matrizDeBotones.get(fila-1).get(columna+1).getIcon()==colorRival)
	    	//busco una ficha mia mas a la derecha y arriba en diagonal
	        for(int i=1; (i+columna)<8 && (fila-i)>=0; i++)
	        	//Si esta casilla es de mi color
	            if(matrizDeBotones.get(fila-i).get(i+columna).getIcon() == turno){
	            	//desde la del rival hasta la de mi color
	            	for(int k=1; k<i; k++){ 
	            		//cambio el color de la ficha
	            		matrizDeBotones.get(fila-k).get(columna+k).setIcon(turno);
	            	}
	            	return true;
	            }
	            else if(matrizDeBotones.get(fila-i).get(i+columna).esVacio())
	                break;

	    //diagonal arriba izquierda
	    if(columna > 1 && fila > 1 && 
	    	matrizDeBotones.get(fila-1).get(columna-1).getIcon()==colorRival)
	    	//busco una ficha mia mas a la derecha y abajo
	        for(int i=1; (columna-i)>=0 && (fila-i)>=0; i++)
	        	//Si esta casilla es de mi color
	            if(matrizDeBotones.get(fila-i).get(columna-i).getIcon() == turno){
	            	//desde la del rival hasta la de mi color
	            	for(int k=1; k<i; k++){ 
	            		//cambio el color de la ficha
	            		matrizDeBotones.get(fila-k).get(columna-k).setIcon(turno);
	            	}
	            	return true;
	            }
	            else if(matrizDeBotones.get(fila-i).get(columna-i).esVacio())
	                break;

	    //diagonal abajo izquierda
	    if(columna > 1 && fila < 6 && 
	    	matrizDeBotones.get(fila+1).get(columna-1).getIcon()==colorRival)
	    	//busco una ficha mia mas a la derecha y abajo
	        for(int i=1; (columna-i)>=0 && (fila+i)<8; i++)
	        	//Si esta casilla es de mi color
	            if(matrizDeBotones.get(fila+i).get(columna-i).getIcon() == turno){
	            	//desde la del rival hasta la de mi color
	            	for(int k=1; k<i; k++){ 
	            		//cambio el color de la ficha
	            		matrizDeBotones.get(fila+k).get(columna-k).setIcon(turno);
	            	}
	            	return true;
	            }
	            else if(matrizDeBotones.get(fila+i).get(columna-i).esVacio())
	                return false;
	        
	    return false;
	}
}

